package start;
// This file contains material supporting section 3.7 of the textbook:
// "Object Oriented Software Engineering" and is issued under the open-source
// license found at www.lloseng.com 

import java.io.IOException;
import java.sql.SQLException;
import java.util.Vector;

import ocsf.server.AbstractServer;
import ocsf.server.ConnectionToClient;

/**
 * This class overrides some of the methods in the abstract 
 * superclass in order to give more functionality to the server.
 *
 * @author Dr Timothy C. Lethbridge
 * @author Dr Robert Lagani&egrave;re
 * @author Fran&ccedil;ois B&eacute;langer
 * @author Paul Holden
 * @version July 2000
 */
public class EchoServer extends AbstractServer 
{
	//Class variables *************************************************

	/**
	 * The default port to listen on.
	 */
	final public static int DEFAULT_PORT = 5556;

	//Constructors ****************************************************

	/**
	 * Constructs an instance of the echo server.
	 *
	 * @param port The port number to connect on.
	 */
	public EchoServer(int port) 
	{
		super(port);
	}


	//Instance methods ************************************************

	/**
	 * This method sends a message to a specific client.
	 *
	 * @param msg The message to be sent to the client.
	 * @param client The connection to which the message will be sent.
	 */	
	public void sendMsgToClient(ConnectionToClient client, Object msg){
		try{
			client.sendToClient(msg);
		}
		catch (IOException ex) {
			ex.printStackTrace();
		}
	}
	
	/**
	 * This method handles any messages received from the client.
	 *
	 * @param msg The message received from the client.
	 * @param client The connection from which the message originated.
	 */
	public void handleMessageFromClient
	(Object msg1, ConnectionToClient client)
	{

		
		DBhandler db=null;
		String msg=((String)msg1).toLowerCase();
		if ( ! (msg.startsWith("select") || msg.startsWith("insert") ||
				msg.startsWith("update") ) ) {
			System.out.println("Message received: " + msg + " from " + client);  // shown at the server only
			sendMsgToClient(client,"The message: " + msg + " was received by the server.\n\n" +
					"Please enter your query:"); // confirmation to the client
			return;
		}
		try {
			db = new DBhandler();
		}
		catch (Exception ex){
			sendMsgToClient(client,"Error: "+ex.getMessage());
		}

		// if user sent a "select" query
		if (msg.startsWith("select")){
			
			Object result = db.selectQuery(msg);

			if (result instanceof Vector){
				Vector res = (Vector)result;
				sendMsgToClient(client , res);
			}
			
			if (result instanceof Boolean){
				sendMsgToClient(client , "No appropriate results for the query!\n\n"+
						"Please enter your query:");
			}
			
			if (result instanceof SQLException){
				sendMsgToClient(client , "Error: "+((SQLException)result).getMessage());
			}
			
		}  // end of select query
				
		
		// if user tries to only update the db (no resultset is returned)
		if (msg.startsWith("insert")  ||  msg.startsWith("update") ){
				
				Object result = db.updateDBQuery(msg);
				
				if (true == (Boolean)result)
					sendMsgToClient(client,"The query has accomplished successfully!\n\n"+
							"Please enter your query:");
				else // exception returned
					sendMsgToClient(client , "Error: "+((SQLException)result).getMessage());
		}  // end of update case
		
	}  // end of handleMessageFromClient 


	/**
	 * This method overrides the one in the superclass.  Called
	 * when the server starts listening for connections.
	 */
	protected void serverStarted()
	{
		System.out.println
		("Server listening for connections on port " + getPort());
	}

	/**
	 * This method overrides the one in the superclass.  Called
	 * when the server stops listening for connections.
	 */
	protected void serverStopped()
	{
		System.out.println
		("Server has stopped listening for connections.");
	}

	//Class methods ***************************************************

	/**
	 * This method is responsible for the creation of 
	 * the server instance (there is no UI in this phase).
	 *
	 * @param args[0] The port number to listen on.  Defaults to 5555 
	 *          if no argument is entered.
	 */
	public static void main(String[] args) 
	{
		int port = 0; //Port to listen on

		try
		{
			port = Integer.parseInt(args[0]); //Get port from command line
		}
		catch(Throwable t)
		{
			port = DEFAULT_PORT; //Set port to 5555
		}

		EchoServer sv = new EchoServer(port);
		try 
		{
			sv.listen(); //Start listening for connections
		} 
		catch (Exception ex) 
		{
			System.out.println("ERROR - Could not listen for clients!");
		}
	}
}
//End of EchoServer class
